import br.unifor.finance.business.bo.BusinessObject;
import br.unifor.finance.business.bo.DespesaBusinessObject;
import br.unifor.finance.business.bo.TipoDespesaBusinessObject;
import br.unifor.finance.business.bo.UsuarioBusinessObject;
import br.unifor.finance.business.bo.classes.BusinessObjectAbstractFactory;
import br.unifor.finance.business.bo.classes.TipoDespesaBusinessObjectImpl;
import br.unifor.finance.common.business.entity.Despesa;
import br.unifor.finance.common.business.entity.ParcelaDespesa;
import br.unifor.finance.common.business.entity.ParcelaDespesaPK;
import br.unifor.finance.common.business.entity.TipoDespesa;
import br.unifor.finance.common.business.entity.Usuario;
import br.unifor.finance.business.persistence.DAOAbstractFactory;
import br.unifor.finance.persistence.dao.GenericDAO;
import br.unifor.finance.persistence.dao.GenericDAOException;
import br.unifor.finance.persistence.dao.jpa.GenericJPADAO;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
 * TestMain.java
 *
 * Created on 8 de Julho de 2007, 16:15
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 * Classe para fins de testes.
 * @author Clebernaice, Cleilson, Leonardo
 * @version 1.0, 16/06/2007.
 */
public class TestMain {
  
  /**
   * Cria uma nova instancia de TestMain.
   */
  public TestMain() {
  }
  
  /**
   * Ponto inicial do programa.
   * @param args os argumentos de linha de comando
   */
  public static void main(String[] args) {
    
    //testTipoDespesaBusinessObject();
    
    //testUsuarioBusinessObject();
    
    //testDespesaBusinessObject();
    
    testParcelaDespesa1();
    
    testParcelaDespesa2();
    
    testParcelaDespesa3();
    
  }

  private static void testParcelaDespesa1() {
    DespesaBusinessObject bo = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getDespesaBO();
    GenericDAO<ParcelaDespesa, Integer> dao =
            new GenericJPADAO<ParcelaDespesa, Integer>("finance-business-PUTest");
    
    Integer id = null;
    ParcelaDespesa parcela = new ParcelaDespesa();
    parcela.setData(new Date());
    parcela.setSituacao('P');
    parcela.setValor(100d);
    
    Despesa despesa = bo.findById(1);
    parcela.setDespesa(despesa);

    try {
      id = dao.insert(parcela);
    } catch (GenericDAOException ex) {
      ex.printStackTrace();
    }
    
    System.out.println(parcela);
    
    parcela = new ParcelaDespesa();
    parcela.setData(new Date());
    parcela.setSituacao('N');
    parcela.setValor(200d);
    parcela.setDespesa(despesa);
    despesa.getParcelas().add(parcela);
    bo.update(despesa);
  }
  
  private static void testParcelaDespesa2() {
    /*DespesaBusinessObject bo = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getDespesaBO();
    GenericDAO<ParcelaDespesa, ParcelaDespesaPK> dao =
            new GenericJPADAO<ParcelaDespesa, ParcelaDespesaPK>("finance-business-PUTest");
    
    Despesa despesa = bo.findById(1);
    
    ParcelaDespesaPK pk1 = null;
    ParcelaDespesaPK pk = new ParcelaDespesaPK(despesa, (byte) 1);
    ParcelaDespesa parcela = new ParcelaDespesa(pk);
    parcela.setData(new Date());
    parcela.setSituacao('P');
    parcela.setValor(100d);
    
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("despesa", despesa);
    List<ParcelaDespesa> list = null;
    try {
      list = dao.findList("ParcelaDespesa.findByDespesa2", params);
    } catch (GenericDAOException ex) {
      ex.printStackTrace();
    }
    if (list != null) {
      System.out.println(list.size());
      pk.setParcelaId((byte)(list.size() + 1));
    }

    try {
      pk1 = dao.insert(parcela);
    } catch (GenericDAOException ex) {
      ex.printStackTrace();
    }
    
    System.out.println(parcela);*/
  }
  
  private static void testParcelaDespesa3() {
    /*DespesaBusinessObject bo = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getDespesaBO();
    
    Despesa despesa = bo.findById(1);
    System.out.println(despesa);
    
    for (ParcelaDespesa elem : despesa.getParcelas()) {
      System.out.println(elem);
    }    
    
    ParcelaDespesaPK pk = 
            new ParcelaDespesaPK(despesa, (byte)(despesa.getParcelas().size() + 1));
    ParcelaDespesa parcela = new ParcelaDespesa();
    parcela.setData(new Date());
    parcela.setSituacao('P');
    parcela.setValor(100d);
    System.out.println(parcela);
    despesa.getParcelas().add(parcela);
    
    bo.update(despesa);
    
    System.out.println(parcela);*/
  }

  private static void testDespesaBusinessObject() {
    DespesaBusinessObject bo = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getDespesaBO();
    TipoDespesaBusinessObject boTipoDespesa = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getTipoDespesaBO();
    UsuarioBusinessObject boUsuario = 
            BusinessObjectAbstractFactory.
              getEntityManagerBusinessObjectFactory("finance-business-PUTest").
              getUsuarioBO();
    
    Despesa despesa = new Despesa();
    despesa.setData(new Date());
    despesa.setDescricao("Teste Insert");
    despesa.setNumeroParcelas(new Byte((byte)0));
    TipoDespesa tipoDespesa = boTipoDespesa.findById(1);
    despesa.setTipo(tipoDespesa);
    Usuario usuario = boUsuario.findById(1);
    despesa.setUsuario(usuario);
    despesa.setValor(new Double(1.0d));
    Integer key = bo.insert(despesa);
    System.out.println(despesa);
    
    despesa = new Despesa();
    despesa.setData(new Date());
    despesa.setDescricao("Teste");
    despesa.setTipo(tipoDespesa);
    despesa.setUsuario(usuario);
    despesa.setValor(new Double(1.0d));
    key = bo.insert(despesa);
    
    despesa.setDescricao("Teste Update");
    despesa.setValor(new Double(2.0d));
    bo.update(despesa);
    
    despesa = new Despesa();
    despesa.setData(new Date());
    despesa.setDescricao("Teste");
    despesa.setTipo(tipoDespesa);
    despesa.setUsuario(usuario);
    despesa.setValor(new Double(1.0d));
    key = bo.insert(despesa);
    bo.delete(despesa);
    
    Collection<Despesa> despesaCollection = bo.findAll();
    System.out.println(despesaCollection.size());
    
    despesaCollection = bo.findByAttribute("descricao", "Teste Update");
    System.out.println(despesaCollection.size());
  }
  
  private static void testTipoDespesaBusinessObject() {
    TipoDespesaBusinessObject bo = 
            BusinessObjectAbstractFactory.getEntityManagerBusinessObjectFactory("finance-business-PUTest").getTipoDespesaBO();
    
    TipoDespesa tipoDespesa = new TipoDespesa();
    tipoDespesa.setNome("Teste Insert");
    tipoDespesa.setDescricao("Teste Insert");
    Integer key = bo.insert(tipoDespesa);
    System.out.println(tipoDespesa);
    
    tipoDespesa = new TipoDespesa();
    tipoDespesa.setNome("Teste");
    tipoDespesa.setDescricao("Teste");
    key = bo.insert(tipoDespesa);
    
    tipoDespesa.setNome("Teste Update");
    tipoDespesa.setDescricao("Teste Update");
    bo.update(tipoDespesa);
    System.out.println(tipoDespesa);
    
    tipoDespesa = new TipoDespesa();
    tipoDespesa.setNome("Teste");
    tipoDespesa.setDescricao("Teste");
    key = bo.insert(tipoDespesa);
    bo.delete(tipoDespesa);
    System.out.println(tipoDespesa);
    
    Collection<TipoDespesa> tipoDespesaCollection = bo.findAll();
    System.out.println(tipoDespesaCollection.size());
    
    tipoDespesaCollection = bo.findByAttribute("nome", "Teste Update");
    System.out.println(tipoDespesaCollection.size());
    
    /*TipoDespesa tipoDespesa = bo.findById(9007);
    System.out.println(tipoDespesa.getNome());*/
  }
  
  private static void testUsuarioBusinessObject() {
    UsuarioBusinessObject bo = 
            BusinessObjectAbstractFactory.getEntityManagerBusinessObjectFactory("finance-business-PUTest").getUsuarioBO();
    
    Usuario usuario = new Usuario();
    usuario.setNome("Teste Insert");
    usuario.setLogin("Teste Insert");
    usuario.setSenha("Teste Insert");
    Integer key = bo.insert(usuario);
    System.out.println(usuario);
    
    usuario = new Usuario();
    usuario.setNome("Teste");
    usuario.setLogin("Teste");
    usuario.setSenha("Teste");
    key = bo.insert(usuario);
    
    usuario.setNome("Teste Update");
    usuario.setLogin("Teste Update");
    usuario.setSenha("Teste Update");
    bo.update(usuario);
    System.out.println(usuario);
    
    usuario = new Usuario();
    usuario.setNome("Teste");
    usuario.setLogin("Teste");
    usuario.setSenha("Teste");
    key = bo.insert(usuario);
    bo.delete(usuario);
    System.out.println(usuario);
    
    Collection<Usuario> usuarioCollection = bo.findAll();
    System.out.println(usuarioCollection.size());
    
    usuarioCollection = bo.findByAttribute("nome", "Teste Update");
    System.out.println(usuarioCollection.size());
    
    Usuario usuarioLogado = bo.login("admin", "finance");
    System.out.println("Usuario Logado: " + usuarioLogado);
    
    /*Usuario usuario = bo.findById(9007);
    System.out.println(usuario.getNome());*/
  }
}
